package Demo72;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 字符串解码
 *
 */
class Solution {
    // 优化
    public String decodeString(String s) {
        // 准备
        Deque<StringBuffer> str = new ArrayDeque<>();
        Deque<Integer> num = new ArrayDeque<>();
        int len = s.length();
        char[] chars = s.toCharArray();

        str.push(new StringBuffer()); // 这里边界值
        int i = 0;
        while(i < len) {
            if(chars[i] >= '0' && chars[i] <= '9') {
                // 数字, 直接入栈
                int n = 0;
                while(i < len && chars[i] >= '0' && chars[i] <= '9') {
                    n = n * 10 + (chars[i] - '0');
                    i++;
                }
                num.push(n);
            }else if(chars[i] == '[') {
                i++;
                // 左括号, 把左括号之后, 数字之前 的字符串拿出来
                StringBuffer stringBuffer = new StringBuffer();
                while(i < len && chars[i] >= 'a' && chars[i] <= 'z') {
                    stringBuffer.append(chars[i++]);
                }
                // 处理提取出来的字符串
                str.push(stringBuffer);
            }else if(chars[i] == ']') {
                // 拿出数字和字符串
                int n = num.poll();
                StringBuffer stringBuffer = str.poll();
                // 处理解码
                while(n-- > 0) {
                    str.peek().append(stringBuffer);
                }
                i++;
            }else {
                // 不需要解码的字符串, 直接放入栈顶的元素
                StringBuffer stringBuffer = new StringBuffer();
                while(i < len && chars[i] >= 'a' && chars[i] <= 'z') {
                    stringBuffer.append(chars[i++]);
                }
                // 处理提取出来的字符串
                str.peek().append(stringBuffer);
            }
        }
        return str.peek().toString();
    }
    // 第一次
    public String decodeString1(String s) {
        // 准备
        Deque<String> str = new ArrayDeque<>();
        Deque<Integer> num = new ArrayDeque<>();
        int len = s.length();
        char[] chars = s.toCharArray();

        str.push(""); // 这里边界值
        int i = 0;
        while(i < len) {
            if(chars[i] >= '0' && chars[i] <= '9') {
                // 数字, 直接入栈
                int n = 0;
                while(i < len && chars[i] >= '0' && chars[i] <= '9') {
                    n *= 10;
                    n += chars[i++] - '0';
                }
                num.push(n);
            }else if(chars[i] == '[') {
                i++;
                // 左括号, 把左括号之后, 数字之前 的字符串拿出来
                StringBuffer stringBuffer = new StringBuffer();
                while(i < len && chars[i] >= 'a' && chars[i] <= 'z') {
                    stringBuffer.append(chars[i++]);
                }
                // 处理提取出来的字符串
                str.push(stringBuffer.toString());
            }else if(chars[i] == ']') {
                // 拿出数字和字符串
                int n = num.poll();
                String string = str.poll();
                // 处理解码
                StringBuffer stringBuffer = new StringBuffer();
                while(n > 0) {
                    stringBuffer.append(string);
                    n--;
                }
                // 重新入栈
                string = str.poll();
                str.push(string + stringBuffer.toString());
                i++;
            }else {
                // 不需要解码的字符串, 直接放入栈顶的元素
                StringBuffer stringBuffer = new StringBuffer();
                while(i < len && chars[i] >= 'a' && chars[i] <= 'z') {
                    stringBuffer.append(chars[i++]);
                }
                String string = str.poll();
                str.push(string + stringBuffer.toString());
            }
        }

        return str.poll();
    }
}
class Demo {
    public static void main(String[] args) {
        Solution solution = new Solution();
        String s = solution.decodeString("2[abc]3[cd]ef");
        System.out.println(s);
    }
}
